package com.itheima.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.constant.MessageConstant;
import com.itheima.constant.RedisConstant;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.entity.Result;
import com.itheima.pojo.Setmeal;
import com.itheima.service.SetMealService;
import com.itheima.utils.QiniuUtils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import redis.clients.jedis.JedisPool;

import javax.ws.rs.Path;
import java.io.IOException;
import java.util.*;

/**
 * @author 吴
 * @version V1.0
 * @Description  套餐
 * @Package com.itheima.controller
 * @date 2021/11/23 19:31
 */
@RestController
@RequestMapping("/setMeal")
public class SetMealController {

    @Reference
    private SetMealService setMealService;

    @Autowired
    private JedisPool jedisPool;

    /**
     * 上传体验套餐图片
     * 上传成功后，使用 set 方式保存图片名称到redis数据库 保证图片名唯一
     * RedisConstant.SETMEAL_PIC_RESOURCES 只存放垃圾图片 （添加或者修改后进行删除）
     * @param multipartFile  文件信息
     * @return
     */
    @PostMapping("/upload")
    public Result uploadFile(@RequestPart("imgFile") MultipartFile multipartFile){
        // 原始名
        String fileName = multipartFile.getOriginalFilename();
        // 使用UUId生成随即名
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        fileName = UUID.randomUUID().toString().replace("-","")+suffix;
        // 上传到七牛云
        try {
            QiniuUtils.upload2Qiniu(multipartFile.getBytes(),fileName);

            // 使用 set 保存图片名称到redis数据库（添加或者修改后进行删除）
            jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_RESOURCES, fileName);

            return new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS, fileName);
        } catch (IOException e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);
        }
    }

    /**
     *  根据条件查询分页
     * @param queryPageBean  查询条件
     * @return
     */
    @GetMapping("/findPage")
    public Result findPage(QueryPageBean queryPageBean){
        try {
            PageResult result = setMealService.findPage(queryPageBean);
            return new Result(true,MessageConstant.QUERY_SETMEAL_SUCCESS,result);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.QUERY_SETMEAL_FAIL);
        }
    }

    /**
     * 添加套餐
     * @param setmeal  套餐信息
     * @param checkGroupIds     关联的检查项
     * @return
     */
    @PostMapping("/save")
    public Result saveSetMeal(@RequestBody Setmeal setmeal,@RequestParam("checkGroupIds") Integer[] checkGroupIds){
        try {
            setMealService.addSetMeal(setmeal,checkGroupIds);

            // 删除redis中刚上传的图片名称（只存放垃圾图片）
            if(setmeal.getImg() != null){
                jedisPool.getResource().srem(RedisConstant.SETMEAL_PIC_RESOURCES,setmeal.getImg());
            }


            return new Result(true,MessageConstant.ADD_SETMEAL_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.ADD_SETMEAL_FAIL);
        }
    }

    /**
     * 删除套餐组
     * @param setMealId  套餐Id
     * @return
     */
    @DeleteMapping("/{setMealId}")
    public Result deleteSetMeal(@PathVariable("setMealId") Integer setMealId){
        try {
            // 查询原有的套餐信息
            Setmeal setmeal = setMealService.findSetmealById(setMealId);

            setMealService.deleteSetMealById(setMealId);

            // 删除成功后，查询该套餐组图片保存在redis中，方便后续删除
            if(setmeal.getImg() != null) {
                jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_RESOURCES, setmeal.getImg());
            }
            return new Result(true,MessageConstant.DELETE_SETMEAL_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.DELETE_SETMEAL_FAIL);
        }
    }

    /**
     * 根据套餐ID查询数据
     * @param setMealId 套餐ID
     * @return  套餐组信息
     */
    @GetMapping("/findBySetMealId/{setMealId}")
    public Result findBySetMealId(@PathVariable("setMealId") Integer setMealId){
        try {
            Setmeal setmeal = setMealService.findSetmealById(setMealId);
            return new Result(true,MessageConstant.QUERY_SETMEAL_SUCCESS,setmeal);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.QUERY_SETMEAL_FAIL);
        }
    }

    /**
     * 查询套餐组和检查组之间的关系
     * @param setMealId
     * @return  返回检查组的ID
     */
    @GetMapping("/findCheckGroupBySetMealId/{setMealId}")
    public Result findCheckGroupBySetMealId(@PathVariable("setMealId") Integer setMealId){
        try {
            Integer[] groupIds = setMealService.findCheckGroupIdsBySetmealId(setMealId);
            return new Result(true,MessageConstant.QUERY_SETMEAL_SUCCESS,groupIds);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.QUERY_SETMEAL_FAIL);
        }
    }

    /**
     * 修改套餐及其关系表
     * @param checkGroupIds
     * @param setmeal
     * @return
     */
    @PutMapping("/edit")
    public Result editSetMeal(@RequestParam("checkGroupIds") Integer[] checkGroupIds,@RequestBody Setmeal setmeal){
        try {
            boolean flag =false;
           String img = setMealService.findSetmealById(setmeal.getId()).getImg();
            // 判断是否有图片 有：在判断是否跟原图片名是否一致
            if(setmeal.getImg() != null && setmeal.getImg().length()>0 ){
                // 如果没有做修改，就不需要添加到redis中
                if(!setmeal.getImg().equals(img) && img != null){
                    jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_RESOURCES,img);
                    flag =true;
                }
            }

            // 修改
            setMealService.updateSetMeal(setmeal,checkGroupIds);

            //  如果没有做修改图片，就不需要删除去redis中删除
            if(flag){
                jedisPool.getResource().srem(RedisConstant.SETMEAL_PIC_RESOURCES, setmeal.getImg());
            }

            return new Result(true,MessageConstant.EDIT_SETMEAL_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.EDIT_SETMEAL_FAIL);
        }
    }


    /**
     * 使用AOP自动生成套餐列表和套餐详情静态页面
     */
    @GetMapping("/generateHtml")
    public Result generateHtml(){
        setMealService.generateHtml();
        return new Result(true,"静态页面生成成功！");
    }

    /**
     * 查询所有套餐信息
     * @return 套餐组信息
     */
    @GetMapping("/findAll")
    public Result findAll(){
        try {
            List<Setmeal> list = setMealService.findSetMealAll();
            return new Result(true,MessageConstant.QUERY_SETMEAL_SUCCESS,list);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.QUERY_SETMEAL_FAIL);
        }
    }

}
